package com.syf.rocket;


import com.syf.disruptor.DisruptorTemplate;
import com.syf.domain.EntrustOrder;
import com.syf.model.Order;
import com.syf.util.BeanUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.stereotype.Service;

/**
 * 【2】消费者--监听MQ中的队列，有消息则消费：
 *          将消息丢进 ringBuffer 队列
 *
 */
@Service
@Slf4j
public class MessageConsumerListener {

    @Autowired
    private DisruptorTemplate disruptorTemplate;  //ringBuffer 队列

    /**
     * 消息监听--消费(处理)消息：
     *      撤销委托单请求 也当作Rocket -> RingBuffer 当作消息处理，可以避免加锁和多线程抢占所带来的系统资源损耗
     *      对于一个委托单 若是多线程操作，则会出现 一个线程执行撮合，一个线程执行撤销操作现象
     *
     * @param entrustOrder
     */
    @StreamListener("order_in")
    public void handleMessage(EntrustOrder entrustOrder) {
        Order order = null;
        if (entrustOrder.getStatus() == 2) { // 该单需要取消（0未成交、1已成交、2已取消、4异常单）
            order = new Order();
            order.setOrderId(entrustOrder.getId().toString());
            order.setCancelOrder(true);
        } else {
            //委托订单信息【exchange-service模块的EntrustOrderServiceImpl 发送的数据是EntrustOrder的Json】
            order = BeanUtils.entrustOrder2Order(entrustOrder);  //将EntrustOrder 转化为我们的Order
        }

        log.info("接收到了委托单:{}", order);
        disruptorTemplate.onData(order);  //将订单丢进 ringBuffer 队列（发布事件）
    }
}
